import cv2 as cv
import numpy as np

# 创建一张空白图像（全黑的背景图）
# 图像尺寸为 800x600，3 表示 RGB 三通道
width, height = 800, 600
image = np.zeros((height, width, 3), dtype=np.uint8)  # 图像像素值范围为 0-255

# 1. 绘制直线
start_point = (50, 50)  # 直线的起点坐标 (x, y)
end_point = (200, 50)   # 直线的终点坐标 (x, y)
color = (0, 255, 0)     # 绿色 (B, G, R)
thickness = 15           # 线条的粗细，单位为像素

# 使用 LINE_8（默认，连接点的像素形式为 8 方向）
cv.line(image, start_point, end_point, color, thickness, lineType=cv.LINE_8)

# 使用 LINE_AA（抗锯齿，适合显示效果更平滑的线条）
cv.line(image, (50, 100), (250, 100), (255, 0, 0), thickness, lineType=cv.LINE_AA)

# 使用 LINE_4（4 方向连接，适合快速绘制但边缘较粗糙）
cv.line(image, (50, 150), (250, 150), (0, 0, 255), thickness, lineType=cv.LINE_4)

thickness = 2           # 线条的粗细，单位为像素

# 2. 绘制矩形
top_left = (300, 100)      # 矩形的左上角坐标
bottom_right = (500, 300)  # 矩形的右下角坐标
color = (255, 0, 0)        # 蓝色 (B, G, R)
cv.rectangle(image, top_left, bottom_right, color, thickness)  # 在图像上绘制矩形

# 3. 绘制圆形
center = (400, 400)  # 圆心坐标
radius = 50          # 圆的半径，单位为像素
color = (0, 0, 255)  # 红色 (B, G, R)
cv.circle(image, center, radius, color, thickness)  # 在图像上绘制圆形

# 4. 绘制椭圆
center = (600, 150)    # 椭圆的中心点坐标
axes = (100, 50)       # 椭圆的长轴和短轴长度
angle = 30             # 椭圆的旋转角度（相对于水平轴）
start_angle = 0        # 椭圆的起始角度（0 表示从右侧开始）
end_angle = 360        # 椭圆的结束角度（360 表示完整的椭圆）
color = (255, 255, 0)  # 青色 (B, G, R)
cv.ellipse(image, center, axes, angle, start_angle, end_angle, color, thickness)  # 绘制椭圆

# 5. 绘制多边形
points = np.array([[100, 500], [200, 450], [300, 500], [250, 550],[123,456]], np.int32)  # 多边形顶点坐标
points = points.reshape((-1, 1, 2))  # reshape 为 OpenCV 的绘制函数要求的形状
color = (255, 0, 255)  # 紫色 (B, G, R)
cv.polylines(image, [points], isClosed=True, color=color, thickness=2)  # 绘制闭合多边形

# 6. 在图像上添加文字
text = "OpenCV Drawing Example"  # 要添加的文本
org = (50, 550)  # 文本的起始坐标 (左下角为基线起点)
font = cv.FONT_HERSHEY_SIMPLEX  # 字体类型
font_scale = 1  # 字体大小
color = (255, 255, 255)  # 白色 (B, G, R)
thickness = 1  # 文本线条的粗细
cv.putText(image, text, org, font, font_scale, color, thickness, cv.LINE_AA)  # 在图像上添加文字

# 4. 添加注释，说明线条类型
cv.putText(image, "LINE_8", (50, 40), cv.FONT_HERSHEY_SIMPLEX, 0.6, (255, 255, 255), 1)
cv.putText(image, "LINE_AA", (50, 90), cv.FONT_HERSHEY_SIMPLEX, 0.6, (255, 255, 255), 1)
cv.putText(image, "LINE_4", (50, 140), cv.FONT_HERSHEY_SIMPLEX, 0.6, (255, 255, 255), 1)


# 显示图像
cv.imshow("Drawing Example", image)  # 创建窗口并显示绘制的图像
cv.waitKey(0)  # 等待用户按任意键关闭窗口
cv.destroyAllWindows()  # 关闭所有 OpenCV 窗口

# 保存图像到文件
cv.imwrite("drawing_example.png", image)  # 将绘制的图像保存为 PNG 文件
